#include "methodmanager.h"
#include <QDir>
#include <QFile>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>


MethodManager::MethodManager() {
    createInitialMethodFile();
}

MethodManager::~MethodManager() {

}

bool MethodManager::createMethod(const Method& method) {
    // 加载现有方法文件
    QJsonArray jsonArray = loadMethodFile();

    // 检查方法是否已存在
    for (const QJsonValue& value : jsonArray) {
        QJsonObject jsonObject = value.toObject();
        if (jsonObject["methodName"].toString() == method.methodName) {
            return false; // 方法已存在
        }
    }

    // 构建方法对象
    QJsonObject methodObject;
    methodObject["methodName"] = method.methodName;
    methodObject["creationTime"] = method.creationTime.toString();
    methodObject["createdBy"] = method.createdBy;
    methodObject["lightIntensity"] = method.lightIntensity;
    methodObject["integrationTime"] = method.integrationTime;
    methodObject["integrationCount"] = method.integrationCount;
    QJsonArray displacementArray;
    for (int value : method.displacement) {
        displacementArray.append(value);
    }
    methodObject["displacement"] = displacementArray; // 如果需要保存位移
    // 添加新方法
    jsonArray.append(methodObject);

    // 保存方法文件
    saveMethodFile(jsonArray);

    return true; // 创建方法成功
}

Method MethodManager::getMethod(const QString& methodName)
{
    // 加载现有方法文件
    QJsonArray jsonArray = loadMethodFile();

    // 查找指定方法
    for (const QJsonValue& value : jsonArray) {
        QJsonObject jsonObject = value.toObject();
        if (jsonObject["methodName"].toString() == methodName) {
            Method method;
            method.methodName = jsonObject["methodName"].toString();
            method.createdBy = jsonObject["createdBy"].toString();
            method.lightIntensity = jsonObject["lightIntensity"].toInt();
            method.integrationTime = jsonObject["integrationTime"].toInt();
            method.integrationCount = jsonObject["integrationCount"].toInt();
            QJsonArray displacementArray = jsonObject["displacement"].toArray();
            method.displacement.clear();
            for (const QJsonValue& displacementValue : displacementArray) {
                method.displacement.append(displacementValue.toInt());
            }
            return method;
        }
    }

    // 若未找到指定方法，返回一个 empty 的 Method 对象
    return Method();
}

QVector<Method> MethodManager::getAllMethod() {
    QVector<Method> methodList;

    // 加载现有方法文件
    QJsonArray jsonArray = loadMethodFile();

    // 遍历每个方法对象，并添加到方法列表中
    for (const QJsonValue& value : jsonArray) {
        QJsonObject jsonObject = value.toObject();
        Method method;
        method.methodName = jsonObject["methodName"].toString();
        method.creationTime = QDateTime::fromString(jsonObject["creationTime"].toString());
        method.createdBy = jsonObject["createdBy"].toString();
        method.lightIntensity = jsonObject["lightIntensity"].toInt();
        method.integrationTime = jsonObject["integrationTime"].toInt();
        method.integrationCount = jsonObject["integrationCount"].toInt();
        QJsonArray displacementArray = jsonObject["displacement"].toArray();
        method.displacement.clear();
        for (const QJsonValue& displacementValue : displacementArray) {
            method.displacement.append(displacementValue.toInt());
        }
        methodList.append(method);
    }

    return methodList;
}

QVector<Method> MethodManager::getMethodByUser(const QString& username) {
    QVector<Method> methodList;

    // 加载现有方法文件
    QJsonArray jsonArray = loadMethodFile();

    // 遍历每个方法对象，并添加到方法列表中
    for (const QJsonValue& value : jsonArray) {
        QJsonObject jsonObject = value.toObject();
        QString createdBy = jsonObject["createdBy"].toString();
        if (createdBy == username) {
            Method method;
            method.methodName = jsonObject["methodName"].toString();
            method.creationTime = QDateTime::fromString(jsonObject["creationTime"].toString());
            method.createdBy = jsonObject["createdBy"].toString();
            method.lightIntensity = jsonObject["lightIntensity"].toInt();
            method.integrationTime = jsonObject["integrationTime"].toInt();
            method.integrationCount = jsonObject["integrationCount"].toInt();
            QJsonArray displacementArray = jsonObject["displacement"].toArray();
            method.displacement.clear();
            for (const QJsonValue& displacementValue : displacementArray) {
                method.displacement.append(displacementValue.toInt());
            }
            methodList.append(method);
        }
    }
    return methodList;
}


bool MethodManager::deleteMethod(const QString& methodName) {
    // 加载现有方法文件
    QJsonArray jsonArray = loadMethodFile();

    // 查找要删除的方法
    for (int i = 0; i < jsonArray.size(); i++) {
        QJsonObject jsonObject = jsonArray[i].toObject();
        if (jsonObject["methodName"].toString() == methodName) {
            // 从数组中移除方法
            jsonArray.removeAt(i);

            // 保存更新后的方法文件
            saveMethodFile(jsonArray);
            return true; // 删除成功
        }
    }

    return false; // 方法不存在
}

bool MethodManager::checkMethodExists(const QString& methodName) {
    // 加载现有方法文件
    QJsonArray jsonArray = loadMethodFile();

    // 检查方法是否存在
    for (const QJsonValue& value : jsonArray) {
        QJsonObject jsonObject = value.toObject();
        if (jsonObject["methodName"].toString() == methodName) {
            return true; // 方法存在
        }
    }

    return false; // 方法不存在
}

void MethodManager::createInitialMethodFile() {
    // 检查方法文件是否存在
    QString filePath = getMethodFilePath();
    QFile file(filePath);
    if (!file.exists()) {
        // 如果文件不存在，则创建初始文件
        QJsonArray jsonArray;
        saveMethodFile(jsonArray);
    }
}

QString MethodManager::getMethodFilePath() const {
    return "./methods.json";
}

void MethodManager::saveMethodFile(const QJsonArray& jsonArray) {
     QString filePath = getMethodFilePath();
     QFile file(filePath);
     if (file.open(QIODevice::WriteOnly)) {
        QJsonDocument jsonDoc(jsonArray);
        file.write(jsonDoc.toJson());
        file.close();
     }

}

QJsonArray MethodManager::loadMethodFile() const
{
     QString filePath = getMethodFilePath();

     QFile file(filePath);
     if (file.open(QIODevice::ReadOnly)) {
         QByteArray jsonData = file.readAll();
         file.close();
         QJsonDocument jsonDoc(QJsonDocument::fromJson(jsonData));
         return jsonDoc.array();
     }

     return QJsonArray();
}

